//作用域：全局、函数局部


//全局：任何地方都能访问。  很容易 改错了（变量污染）；
//局部：函数执行完成之后，局部就要被释放掉！

//不够用、
// 一种的特性的模式出来； 闭包；

//累加的一个函数
function fm() {
    var sum = 0;
    //一套设计好的操作函数；之后只能通过这些函数才能修改sum值；
    function fn(num) {
        sum += num;
        console.log("sum:", sum);
    }
    function fx(num) {
        sum -= num;
        console.log("sum", sum);
    }
    return { fn, fx };
}

let obj = fm(); //内存中存储了一个sum
obj.fn(10); //+10
obj.fx(5); //-5
obj=null;//回收sum


// let obj2 = fm();  //又创建了一个新的 sum
// obj2.fn(10);// 新的sum +10；  10

// obj.fn(10);//15

// obj = null;//释放
// obj2 = null;//释放

// let f = fm();
// sum = 100;
// console.log(sum);
// f(1)
// //手动释放：
// f = null;



//优点：有全局变量一样，长期存储在内存中。但是避免了 全局变量那样的 变量污染；
//sum 的值，想改变的话，怎么做？ sum 再外面只能被f 改变；
//缺点：内存泄漏;

// let 块级作用域 

//1.这个知识点的 优缺点是什么？ 作用是什么？

// 跟其他的知识点 对比；
{
    let obj = {};
    // console.log(obj.name);
}
//原型链去做？继承：A继承了B； B有的东西 A也有了

//想用面向对象（java ）的方式去编写js项目；
//就需要先实现对象继承；
//js 没有提供很方便的官方的继承方式；
//出现了各种模式（解决特定问题的方法） 去实现这个继承的过程；用到了原型链这个知识点；构造函数；

{
    function Person(name,age,sex){
        this.name=name;
        this.age=age;
        this.sex=sex
    }

    //第一种：构造函数继承
    function Teacher(name,age,sex,workCode) {
        // this.name=name;
        // this.age=age;
        Person.call(this,name,age,sex);
        this.workCode=workCode;
    }
    function Student(name,age,sex,classCode){
        // this.name=name;
        // this.age=age;
        Person.apply(this,[name,age,sex])
        this.classCode=classCode;
    }

    let t1=new Teacher("gao",10,101);
    let s1=new Student("wangcong",20,100);
    console.log(t1.name);
    console.log(s1.age);
    //对象 Teacher和Student中 有一些共有的属性； 可以优化；怎么不用重复写，只写一份就行了！
    //1.把共有的属性提成一个 基础类；
}
{

    function Teacher(name,age,sex,workCode) {
        this.name=name;
        this.age=age;
        this.sex=sex;
        this.workCode=workCode;
    }
    Teacher.prototype.sayName=function(){
        console.log(this.name);
    }
    Teacher.prototype.sayAge=function(){
        console.log(this.age);
    }
    Teacher.prototype.saySex=function(){
        console.log(this.sex);
    }

    let t1=new Teacher("gao",10,"nan",100);
    //原型
    function Student(name,age,sex,classCode){
        this.name=name;
        this.age=age;
        this.sex=sex;
        this.classCode=classCode;       
    }
    // Student.prototype.sayName=function(){
    //     console.log(this.name);
    // }
    // Student.prototype.sayAge=function(){
    //     console.log(this.age);
    // }
    // Student.prototype.saySex=function(){
    //     console.log(this.sex);
    // }
    Student.prototype=t1;
    Student.prototype.classCode=function(){
        console.log(this.classCode);
    }
    
    // 再内存中；
    // function(){
    //     console.log(this.name);
    // }
    // 也是存储了5份；一模一样的；
    //像这种 方法；就要放在原型上；节省内存
}
{
    //有了原型这个东西；
}

